package org.ejb.stateful;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateful;

import org.ejb.api.ICaddieRemote;
import org.ejb.entities.CartItem;
import org.ejb.entities.Item;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * Cette classe represente un caddie electronique.
 */
//@Local(ShoppingCartLocal.class)
@Stateful(mappedName = "org.ejb.stateful.CaddieStateful@Remote", description = "Caddie stateful", name = "CaddieStateful")
public class CaddieStateful implements ICaddieRemote {

	// ======================================
	// =             Attributs              =
	// ======================================
	private ArrayList<CartItem> cartItems;
	private int total;
	String totalString;
	private int nbItemTotal;
	
	
	public int getNbItemTotal() {
		nbItemTotal = 0;
		for (CartItem cartItem : cartItems) {
			nbItemTotal += (cartItem.getQuantity());
		}
		
		return nbItemTotal;
	}

	public void setNbItemTotal(int nbItemTotal) {
		this.nbItemTotal = nbItemTotal;
	}

	public String getTotalString() {
		
		if (cartItems == null || cartItems.isEmpty())
			return "0 euro";

		int total = 0;

		// sum up the quantities
		for (CartItem cartItem : cartItems) {
			total += (cartItem.getSubTotal());
		}

		return total+" euros";
	}
	
	public void setCartItems(ArrayList<CartItem> cartItems) {
		this.cartItems = cartItems;
	}

	public void setTotalString(String totalString) {
		this.totalString = totalString;
	}
	
	public void diminuer(Item item) {
		String mname = "diminuerItem";
		logger.entering(cname, mname, item);
		int i =0;

		for (CartItem cartItem : cartItems) {
			if (compare(cartItem.getItem(), item)) {
				
				cartItem.setQuantity(cartItem.getQuantity()-1);
				if (cartItem.getQuantity() == 0)
					removeItem(cartItem.getItem());
				else{
					cartItems.set(i, cartItem);
				}
				
				return;
			}
			i++;
		}
	}
	
	public void changer(Item item) {
		String mname = "diminuerItem";
		logger.entering(cname, mname, item);
		int i =0;

		for (CartItem cartItem : cartItems) {
			if (compare(cartItem.getItem(), item)) {
				
				cartItem.reverse();
				cartItems.set(i, cartItem);
				
				return;
			}
			i++;
		}
	}
	
	public void augmenter(Item item) {
		String mname = "diminuerItem";
		logger.entering(cname, mname, item);
		int i =0;

		for (CartItem cartItem : cartItems) {
			if (compare(cartItem.getItem(), item)) {
				
				cartItem.setQuantity(cartItem.getQuantity()+1);
				cartItems.set(i, cartItem);
				
				return;
			}
			i++;
		}
	}

	public void setTotal(int total) {
		this.total = total;
	}

	private final String cname = this.getClass().getName();
	private Logger logger = Logger.getLogger("org.ejb.stateful");

	// ======================================
	// =     Methodes Lifecycle Callback    =
	// ======================================

	@PostConstruct
	public void initialize() {
		String mname = "initialize";
		logger.entering(cname, mname);

		cartItems = new ArrayList<CartItem>();
	}

	@PreDestroy
	public void clear() {
		String mname = "clear";
		logger.entering(cname, mname);

		cartItems = null;
	}

	// ======================================
	// =          Methodes publiques        =
	// ======================================

	private boolean compare(Item i, Item c){
		return (i.getName().equals(c.getName()) && i.getConsole().equals(c.getConsole()));
	}

	public void addItem(Item item, String p) {
		String mname = "addItem";
		logger.entering(cname, mname, item);

		boolean itemFound = false;
		for (CartItem cartItem : cartItems) {
			// Si l'article existe deja dans le panier, on modifie uniquement sa quantite
			//            if (cartItem.getItem().equals(item)) {
			//                cartItem.setQuantity(cartItem.getQuantity() + 1);
			//                itemFound = true;
			//            }

			if (compare(cartItem.getItem(), item) && cartItem.getPaiement().equals(p)) {
				cartItem.setQuantity(cartItem.getQuantity() + 1);
				cartItem.setPaiement(p);
				if (p.equals("louer")){
					cartItem.setPrixCourant(item.getPrixLocation());
				}
				else cartItem.setPrixCourant(item.getPrixAchat());
				itemFound = true;
			}
		}
		if (!itemFound){
			// Sinon on le rajoute dans le panier
			if (p.equals("louer")){
				cartItems.add(new CartItem(item, 1, p, item.getPrixLocation()));
			}
			else cartItems.add(new CartItem(item, 1, p, item.getPrixAchat()));
			//cartItems.add(new CartItem(item, 1, p, item.getPrixAchat()));
		}

		logger.exiting(cname, mname, cartItems.size());
	}

	public void removeItem(Item item) {
		String mname = "removeItem";
		logger.entering(cname, mname, item);

		for (CartItem cartItem : cartItems) {
			if (compare(cartItem.getItem(), item)) {
				cartItems.remove(cartItem);
				return;
			}
		}

		logger.exiting(cname, mname, cartItems.size());
	}

	public int getTotal() {
		String mname = "getTotal";
		logger.entering(cname, mname);

		if (cartItems == null || cartItems.isEmpty())
			return 0;

		int total = 0;

		// sum up the quantities
		for (CartItem cartItem : cartItems) {
			total += (cartItem.getSubTotal());
		}

		logger.exiting(cname, mname, total);
		return total;
	}
	

	public void empty() {
		String mname = "empty";
		logger.entering(cname, mname);

		cartItems.clear();
	}

	// ======================================
	// =             Accesseurs             =
	// ======================================
	public ArrayList<CartItem> getCartItems() {
		return cartItems;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return cartItems.isEmpty();
	}

}

